package action

import scala.swing._
import scala.swing.Dialog._
import lang.LOC
import scala.io._
import parser._
import gui._
import java.awt.Toolkit
import java.awt.Font
import java.awt.event._
import java.io.File
import javax.swing.JOptionPane
import java.io.FileInputStream
import java.io.FileOutputStream
import java.util._

/**
 * Diese Klasse erbt von der Action-Klasse und ist fuer die Funktionen des Datei-Menues
 * zustaendig. Hierzu wird ueber das Attribut subAction die jeweilige Aktion aufgerufen.
 */

case class MenuFile(name: String, tt: Layout, subAction: Int) extends Action(name) {

  def apply() = {
      subAction match {
      case 1 =>
        var newpane = new ScrollTextAreaPane(true)
        tt.addTabTop(LOC.get("Unbekannt"), newpane)
        tt.newProject(LOC.get("Unbekannt"), null, tt.tabstop, newpane)
        tt.tabstop.setSelectedIndex(tt.tabstop.peer.getTabCount()-1)
        newpane.textarea.peer.requestFocusInWindow
        
      case 2 =>
        val chooser = new FileChooser {
          multiSelectionEnabled = false    
        }
        chooser.peer.setCurrentDirectory(new File(LOC.filePath))
        chooser.showOpenDialog(tt)
        if(chooser.selectedFile != null) {
          var newpane = new ScrollTextAreaPane(true){setText(scala.io.Source.
                                                      fromFile(chooser.selectedFile).mkString)}
          tt.tabstop.addTab(chooser.selectedFile.getName, newpane)
          tt.newProject(chooser.selectedFile.getName,
                        chooser.selectedFile, tt.tabstop, newpane)
          tt.tabstop.setSelectedIndex(tt.tabstop.peer.getTabCount()-1)
          //Pfad merken
          var prop = new Properties()
          var fis = new FileInputStream(CONST.CONFIG_FILE)
          prop.load(fis)
          prop.setProperty("filePath", chooser.selectedFile.getParent)
          LOC.filePath = chooser.selectedFile.getParent
          var fos = new FileOutputStream(CONST.CONFIG_FILE)
          prop.store(fos, "config")
          fos.close()
        }

      case 4 => // Datei speichern
        var activProject = tt.getActivProject
        activProject.saveToFile(tt)
        

      case 5 => // Datei speichern unter...
        var activProject = tt.getActivProject
        activProject.saveToNewFile(tt)

      case 6 => // Alles speichern
        for(i <- tt.openprojects)
          i.saveToFile(tt)

      case 8 =>
        var activProject = tt.getActivProject
        if(activProject == null)
          Dialog.showMessage(tt, LOC.get("FehlerDateiAuswahl"), LOC.get("Fehler"),
                             Dialog.Message.Error)
        else if(activProject.maindatei != null)
          new ProcessBuilder("cmd", "/c", activProject.getFileName).start()

      case 10 =>
        val auswahl = new Array[Object](5)
        auswahl(0) = LOC.get("Quelltext")
        auswahl(1) = LOC.get("Ausgabe")
        auswahl(2) = LOC.get("Trace")
        auswahl(3) = LOC.get("Propagiert")
        auswahl(4) = LOC.get("Beweisbedarf")

        var print = JOptionPane.showInputDialog(tt.peer, LOC.get("AusdruckAuswahlText") + ":",
                                                LOC.get("AusdruckAuswahl"),
                                                JOptionPane.QUESTION_MESSAGE, icon, auswahl,
                                                null) match {
          case x:String => x
          case _ => null
        }
        
        if(print != null) {
        
          var tk = Toolkit.getDefaultToolkit();
          var pj = tk.getPrintJob(new java.awt.Frame, "", null );

          if(pj != null) {
            val iScreenResol = tk.getScreenResolution()
            val iPageResol = pj.getPageResolution()
            val dimScreenSize = tk.getScreenSize()
            val dimPageDimension = pj.getPageDimension()
            
            var schriftgr = Layout.printsize
            var iAddY = schriftgr*3/2
            var iRand: Int =  (iPageResol * 2 / 2.54).toInt
            var iPosX = iRand + iRand/4
            var iPosY = iPosX - iAddY/2
            var iWdth = dimPageDimension.width - iRand * 2
            var iHght = dimPageDimension.height - iRand * 2

            var bckPosY = iPosY


            var pg = pj.getGraphics()
            pg.setFont(new Font("Courier New", Font.PLAIN, schriftgr))

            pg.drawString(print.toUpperCase, iPosX, iPosY)
            iPosY += iAddY
            pg.drawString("====================================================", iPosX, iPosY)
            iPosY += iAddY

            var activProject = tt.getActivProject
            var PrintText = ""

            if(print.equals(LOC.get("Quelltext")))
              PrintText = tt.getSelectedTabTopText
            else if(print.equals(LOC.get("Ausgabe")))
              PrintText = activProject.getT(1)
            else if(print.equals(LOC.get("Trace")))
              PrintText = activProject.getT(2)
            else if(print.equals(LOC.get("Propagiert")))
              PrintText = activProject.getT(3)
            else if(print.equals(LOC.get("Beweisbedarf")))    
              PrintText = activProject.getT(4)


            for(i <- PrintText.split("\n")) {
              if(iPosY > iHght) {
                pg.dispose()
                pg = pj.getGraphics()
                pg.setFont(new Font("Courier New", Font.PLAIN, schriftgr))
                iPosY = bckPosY
              }
              pg.drawString(i, iPosX, iPosY)
              iPosY += iAddY
            }


            pg.dispose()

            pj.end()
          }
          
        }

      case 12 =>
        if(tt.hasNonsavedProjects()) {
          showConfirmation(parent = null,         
                                title = LOC.get("WirklichBeendenTitle"),         
                                message = LOC.get("WirklichBeendenText")       
          ) match {
            case Result.Ok => System.exit(0)        
            case _ => ()       
          }
        }
        else
          System.exit(0)

      case _ =>
        println("Action1.scala")
    }
    
  }
  
}


 